const apiService = require('../../../utils/yxqzutil.js'); // 引入自定义的 API 服务工具
Page({
    data: {
        userInfo: {
            openid: "", // 用户的唯一标识
            nickName: "", // 用户昵称
            avatarUrl: "" // 用户头像 URL
        },
        isAgreed: false, // 协议是否被同意的状态
        userInfo_tank: false, // 显示弹框的标识
    },

    // 切换协议复选框状态
    toggleAgreement() {
        this.setData({
            isAgreed: !this.data.isAgreed, // 反转协议同意状态
        });
    },

    /**
     * 关闭/打开弹框
     */
    closeTank(e) {
        // 如果弹框未显示，则尝试获取用户信息
        if (!this.data.userInfo_tank) {
            wx.cloud.database().collection('userInfo')
                .get() // 从数据库中获取用户信息
                .then(res => {
                    console.log("用户信息====", res); // 打印用户信息
                    if (res.data.length) { // 如果数据库中存在用户信息
                        this.setData({
                            userInfo: res.data[0], // 更新用户信息
                            userInfo_tank: false, // 隐藏弹框
                        });
                        wx.reLaunch({
                            url: '../me/index' // 重定向到个人中心页面
                        });
                    } else {
                        console.log("还未注册====", res); // 用户未注册
                        this.setData({
                            userInfo_tank: true // 显示弹框
                        });
                    }
                }).catch(res => {
                    console.log('提醒你请添加userInfo表'); // 捕获错误，提示用户添加 userInfo 表
                });
        } else {
            this.setData({
                userInfo_tank: false // 隐藏弹框
            });
        }
    },

    // 下载头像图片到本地再上传到云存储
    downloadAvatar(url, attempts = 3) {
        wx.downloadFile({
            url: url, // 头像的下载链接
            success: (downloadRes) => {
                if (downloadRes.statusCode === 200) { // 下载成功
                    this.setData({
                        'userInfo.avatarUrl': downloadRes.tempFilePath // 本地临时路径
                    });
                    wx.setStorageSync('userInfo', res.userInfo); // 将用户信息存储到缓存
                } else {
                    console.log('下载失败，状态码:', downloadRes.statusCode); // 下载失败，输出状态码
                    this.retryDownload(url, attempts); // 进行重试
                }
            },
            fail: (err) => {
                console.log("头像下载失败", err); // 下载失败，输出错误信息
                this.retryDownload(url, attempts); // 进行重试
            }
        });
    },

    // 尝试重试下载头像，最多 attempts 次
    retryDownload(url, attempts) {
        if (attempts > 0) { // 如果还有重试次数
            console.log(`重试下载头像，剩余次数: ${attempts}`); // 输出重试信息
            setTimeout(() => {
                this.downloadAvatar(url, attempts - 1); // 1秒后重试下载
            }, 1000); // 每次重试延迟1秒
        } else {
            wx.showToast({
                title: '头像下载失败', // 提示用户头像下载失败
                icon: 'none'
            });
        }
    },

    // 获取用户的个人信息
    getUserProfile() {
        wx.getUserProfile({
            desc: '用于用于设置页显示昵称与头像', // 用于描述获取用户信息的目的
            success: (res) => {
                // 在这里直接保存用户信息到缓存
                wx.setStorageSync('userInfo', res.userInfo); // 将用户信息存储到缓存
                console.log("获取用户信息成功", res); // 输出成功获取的用户信息
                // 更新 userInfo 的 nickName
                this.setData({
                    'userInfo.nickName': res.userInfo.nickName, // 更新昵称
                    'userInfo.avatarUrl': res.userInfo.avatarUrl, // 更新头像 URL
                });
                // 下载头像图片
                this.downloadAvatar(res.userInfo.avatarUrl); // 使用新的下载方法
            },
            fail: (err) => {
                console.log("用户拒绝授权", err); // 输出用户拒绝授权的信息
                wx.showToast({
                    title: '授权失败，请允许访问用户信息', // 提示用户授权失败
                    icon: 'none'
                });
            }
        });
    },

    // 当输入框失去焦点时，更新 userInfo.nickName
    getNickName(e) {
        this.setData({
            'userInfo.nickName': e.detail.value // 更新为用户输入的昵称
        });
    },

    /**
     * 提交用户信息
     */
    submit(e) {
        if (!this.data.userInfo.avatarUrl) { // 检查头像是否存在
            return wx.showToast({
                title: '请选择头像', // 提示用户选择头像
                icon: 'error'
            });
        }
        if (!this.data.userInfo.nickName) { // 检查昵称是否存在
            return wx.showToast({
                title: '请输入昵称', // 提示用户输入昵称
                icon: 'error'
            });
        }

        this.setData({
            userInfo_tank: false // 隐藏弹框
        });
        wx.showLoading({
            title: '正在注册', // 显示注册中提示
            mask: true
        });
        // 获取 openid
        this.fetchOpenId(); // 调用获取 openid 的方法
    },

    /**
     * 上传头像到云存储
     */
    uploadAvatar() {
        let tempPath = this.data.userInfo.avatarUrl; // 获取本地临时路径
        let suffix = /\.[^\.]+$/.exec(tempPath)[0]; // 获取文件后缀

        // 上传头像到云存储
        wx.cloud.uploadFile({
            cloudPath: 'userimg/' + new Date().getTime() + suffix, // 生成云存储路径
            filePath: tempPath, // 上传的文件路径
            success: res => {
                console.log('上传成功', res); // 输出上传成功的信息
                let fileID = res.fileID; // 获取上传文件的 ID

                // 获取 HTTPS URL
                wx.cloud.getTempFileURL({
                    fileList: [fileID], // 文件 ID 列表
                    success: res => {
                        const httpsURL = res.fileList[0].tempFileURL; // 获取 HTTPS URL
                        this.saveUserInfoToDatabase(httpsURL); // 将用户信息保存到数据库
                    },
                    fail: err => {
                        console.log('获取临时URL失败', err); // 输出获取临时 URL 失败的信息
                        wx.showToast({
                            icon: 'error',
                            title: '上传头像错误', // 提示用户上传头像错误
                        });
                    }
                });
            },
            fail: err => {
                wx.hideLoading(); // 隐藏加载提示
                console.log('上传失败', err); // 输出上传失败的信息
                wx.showToast({
                    icon: 'error',
                    title: '上传头像错误', // 提示用户上传头像错误
                });
            }
        });
    },

    // 调用云函数获取 openid
    fetchOpenId: function () {
        wx.cloud.callFunction({
            name: 'getWXContext', // 调用云函数获取上下文
            success: (res) => {
                const {
                    openid
                } = res.result; // 解构获取 openid
                wx.setStorageSync('openid', openid); // 将 openid 存储到缓存
                this.setData({
                    'userInfo.openid': openid // 将获取到的 openid 存入 data
                });

                // 先上传头像，再调用 getWecharUserByOpenId
                this.uploadAvatar(); // 确保在获取到 HTTPS URL 后再调用
            },
            fail: (err) => {
                console.error("获取 openid 失败:", err); // 输出获取 openid 失败的信息
            }
        });
    },

    /**
     * 将用户信息保存到数据库
     */
    saveUserInfoToDatabase(httpsURL) {
        wx.cloud.database().collection('userInfo')
            .add({
                data: {
                    avatarUrl: httpsURL, // 保存为 HTTPS URL
                    nickName: this.data.userInfo.nickName, // 保存昵称
                    openid: this.data.userInfo.openid // 确保这里也存储 openid
                }
            }).then(() => {
                const { nickName, openid } = this.data.userInfo; // 解构获取用户信息
    
                // 更新 this.data.userInfo 的 avatarUrl 字段
                this.setData({
                    'userInfo.avatarUrl': httpsURL // 更新本地用户头像
                });
    
                wx.setStorageSync('userInfo', this.data.userInfo); // 将用户信息存储到缓存
    
                wx.hideLoading(); // 隐藏加载提示
                wx.reLaunch({
                    url: '/pages/index/index' // 重定向到个人中心页面
                });
    
                console.log("this.getWecharUserByOpenId发送请求到后端API，httpsURL:", openid, nickName, httpsURL); // 检查 httpsURL 是否有效
    
                // 发送用户信息到后端API
                this.getWecharUserByOpenId(openid, nickName, httpsURL); // 调用后端 API
            }).catch(err => {
                wx.hideLoading(); // 隐藏加载提示
                console.log('注册失败', err); // 输出注册失败的信息
                wx.showToast({
                    icon: 'error',
                    title: '注册失败', // 提示用户注册失败
                });
            });
    },

    /**
     * 发送用户信息到后端API
     */
    getWecharUserByOpenId: async function (openid, nickName, httpsURL) {
        const data = {
            id: '', // 新用户时可为空
            openid: openid, // 用户的 openid
            nickName: nickName, // 用户昵称
            avatarUrl: httpsURL, // 用户头像 URL
            gender: 1, // 默认性别
            country: '中国', // 用户国家
            province: '四川省', // 用户省份
            city: '绵阳', // 用户城市
            language: 'zh_CN', // 用户语言
            phoneNumber: 17628688149, // 用户电话号码
            unionid: 1, // unionid
            amounts: 120000000, // 用户金额
            realname: '胡萝卜', // 用户真实姓名
            ipAddress: '192.168.0.11', // 用户 IP 地址
            region: 1, // 区域
            latitude: 1, // 纬度
            longitude: 1, // 经度
            deviceModel: 1, // 设备型号
            operatingSystem: 1, // 操作系统
            username: 1, // 用户名
            password: 1, // 密码
            createBy: '', // 创建者
            createTime: new Date().toISOString(), // 创建时间
            updateBy: '', // 更新者
            updateTime: new Date().toISOString(), // 更新时间
            remark: 1 // 备注
        };

        // 将数据转换为 x-www-form-urlencoded 格式
        const urlEncodedData = Object.keys(data) // 获取对象的键
            .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(data[key])) // 编码为 URL 格式
            .join('&'); // 用 & 连接字符串
        console.log("准备发送请求到后端API，httpsURL:", openid, nickName, httpsURL); // 检查 httpsURL 是否有效
        const wechatUserByjkpService = await apiService.wxRequestPromise({
            url: 'https://773fd401.r5.cpolar.cn/wechat/wechatusers/add', // 后端 API URL
            method: 'POST', // 请求方式
            data: urlEncodedData, // 请求数据
            header: {
                'content-type': 'application/x-www-form-urlencoded', // 设置请求头
                'charset': 'UTF-8' // 字符集
            },
            success(res) {
                console.log("发送到后端成功：", res); // 输出成功发送到后端的信息
            },
            fail(err) {
                console.log("发送到后端失败：", err); // 输出发送到后端失败的信息
            }
        });
    },
});
